package jp.eisbahn.mgapi.api;

import java.io.InputStream;
import java.util.Map;

import jp.eisbahn.mgapi.http.ContentType;
import jp.eisbahn.mgapi.http.HttpMethod;

/**
 * This interface provides some method to represent.
 * @author Yoichiro Tanaka
 */
public interface Request {

    /**
     * Provide the URI to access API you want to use.
     * @return The URI string.
     */
    String getUri();

    /**
     * Provide the HTTP Method to be used at accessing API.
     * @return The kind of HTTP Method.
     */
    HttpMethod getHttpMethod();

    /**
     * Provide the class object of the response.
     * @return The response class object to be used
     * at changing response to model.
     */
    Class<? extends Response> getResponseClass();

    /**
     * Provide the content type.
     * @return The kind of the content type.
     */
    ContentType getContentType();

    /**
     * Provide parameter map object to be specified into the request body.
     * @return The map object to have each parameter.
     */
    Map<String, Object> getParameterMap();

    /**
     * Provide an input stream for a request body.
     * @return The input stream.
     */
    InputStream getBodyStream();

    /**
     * Provide an map object to have request header values.
     * @return The map object to have request header values.
     */
    Map<String, String> getHeaderMap();

}
